package com.tjcd.project.library_base.common.utils;

import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import com.tjcd.project.library_base.common.utils.callback.TextChangeWatcherListener;

import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.disposables.Disposable;
import io.reactivex.rxjava3.subjects.PublishSubject;


/**
 * @Author jiangKunKun
 * @CreateDate 2024/10/30
 * @Description
 * @SpittingGrooves
 */
public class TextChangeWatcher {
    /**
     * 用于发布文本变化事件的 PublishSubject。
     */
    private final PublishSubject<String> subject;

    /**
     * 延迟时间，默认为 2000 毫秒。
     */
    private long debounceTime = 2000;
    private TextChangeWatcherListener mListener;

    /**
     * 私有构造函数，防止外部直接实例化。
     */
    private TextChangeWatcher() {
        this.subject = PublishSubject.create();
    }

    /**
     * 创建一个新的 TextChangeWatcher 实例。
     * @return 新创建的 TextChangeWatcher 实例。
     */
    public static TextChangeWatcher build() {
        return new TextChangeWatcher();
    }

    /**
     * 设置最后一次文本变化的回调监听器，并订阅 subject 的 debounce 流。
     * @param listener 最后一次文本变化的回调监听器。
     * @return 当前 TextChangeWatcher 实例，支持链式调用。
     */
    public TextChangeWatcher setOnTextChangedListener(TextChangeWatcherListener listener) {
        mListener = listener;
        return this;
    }

    /**
     * 创建
     * @return
     */
    public Disposable create() {
        if (mListener == null) {
            throw new IllegalStateException("必须先调用 setOnTextChangedListener 方法设置监听器");
        }
        return subject.debounce(debounceTime, java.util.concurrent.TimeUnit.MILLISECONDS)
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(mListener::onTextChanged);
    }

    /**
     * 附加到 EditText，监听其文本变化。
     * @param view 需要监听的 EditText,TextView,Button
     * @return 当前 TextChangeWatcher 实例，支持链式调用。
     */
    public TextChangeWatcher attachToEditText(View view) {
        if (view instanceof EditText || view instanceof TextView || view instanceof Button) {
            ((TextView) view).addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                    // 文本变化前调用
                }

                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                    // 文本变化时调用
                    subject.onNext(s.toString());
                }

                @Override
                public void afterTextChanged(Editable s) {
                    // 文本变化后调用
                }
            });
        } else {
            throw new IllegalArgumentException("Unsupported view type. Only EditText, TextView, and Button are supported.");
        }
        return this;
    }

    /**
     * 设置延迟时间。
     * @param debounceTime 延迟时间，单位为毫秒。
     * @return 当前 TextChangeWatcher 实例，支持链式调用。
     */
    public TextChangeWatcher setDebounceTime(long debounceTime) {
        this.debounceTime = debounceTime;
        return this;
    }

    /**
     *  Disposable disposable = TextChangeWatcher.build()
     *                 .setDebounceTime(1500)
     *                 .attachToEditText(vBinding.stvDeviceConfigFullNum)
     *                 .setOnTextChangedListener(new TextChangeWatcherListener() {
     *                     @Override
     *                     public void onTextChanged(String text) {
     *
     *                     }
     *                 }).create();
     *         mDisposables.add(disposable);
     */
}
